﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BAL;
using DAL.Entities;
using System.Text.RegularExpressions;

namespace GrouponDesktop.AbmCliente
{
    public partial class AgregarOEditarCliente : Form
    {
        private int IdCliente { set; get; }
        private ClienteEntity clienteInfo;

        private List<CiudadEntity> listado = new List<CiudadEntity>();

        public AgregarOEditarCliente(int intIdCliente)
        {
            IdCliente = intIdCliente;
            InitializeComponent();
            //Cambiamos el titulo
            if (IdCliente == 0)
            {
                this.Name = "Agregar Cliente";
            }
            else
            {
                this.Name = "Editar Cliente";
            }

            //Obtenemos las ciudades
            CiudadBAL proxy = new CiudadBAL();
            listado = proxy.GetCiudades();

            List<CiudadEntity> listCiu = new List<CiudadEntity>();

            
            //Si es un editar buscamos los datos
            if (IdCliente != 0)
            {
                clienteInfo = new ClienteEntity();
                clienteInfo.IntIdCliente = IdCliente;

                ClienteBAL clienteProxy = new ClienteBAL();
                clienteInfo = clienteProxy.GetClienteById(clienteInfo);

                txtApellido.Text = clienteInfo.VarApellido;
                txtCodigoPostal.Text = clienteInfo.IntCodigoPostal.ToString();
                txtDateBirth.Value = clienteInfo.DatFecha_Nac;
                txtDireccion.Text = clienteInfo.VarDireccion;
                //txtDNI.Text = clienteInfo.BigDNI.ToString();
                txtMail.Text = clienteInfo.VarMail;
                txtNomre.Text = clienteInfo.VarNombre;
                txtTelefono.Text = clienteInfo.BigTelefono.ToString();
                if (clienteInfo.BitIsDeleted)
                {
                    cboIsDeleted.SelectedIndex = 0;
                }
                else {
                    cboIsDeleted.SelectedIndex = 1;
                }
                txtDNI.Visible = false;
                lblDNI.Visible = false;

                listCiu = proxy.GetCiudadesByCliente(clienteInfo);

            }

            this.SuspendLayout();

            int topPosition = 0;
            //Agregamos todos los checkbox
            foreach (CiudadEntity item in listado)
            {
                CheckBox checkBox = new CheckBox();

                checkBox.Top = topPosition;
                checkBox.Left = 10;
                checkBox.Text = item.IntIdCiudad + " " + item.VarNombre;
                checkBox.Width = 200;

                topPosition += 25;
                if (IdCliente != 0)
                {
                    //Nos fijamos si esta chequeado
                    var res = listCiu.Find(s => s.IntIdCiudad == item.IntIdCiudad);

                    if (res != null)
                    {
                        checkBox.Checked = true;
                    }
                    res = null;
                }
                this.panel1.Controls.Add(checkBox);
            }


            this.ResumeLayout();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (ValidateForm())
            {
                ClienteBAL proxy = new ClienteBAL();
                CiudadBAL proxyCiu = new CiudadBAL();

                //TODO: VERIFICAR LOS DATOS DE TELEFONO CODIGO PSOTAL Y DNI
                ClienteEntity client = new ClienteEntity();
                client.VarNombre = txtNomre.Text;
                client.VarApellido = txtApellido.Text;
                client.IntCodigoPostal = (txtCodigoPostal.Text != string.Empty) ? Int32.Parse(txtCodigoPostal.Text) : 0;
                client.DatFecha_Nac = txtDateBirth.Value;
                client.VarDireccion = txtDireccion.Text;
                //client.BigDNI = long.Parse(txtDNI.Text);
                client.VarMail = txtMail.Text;
                client.BigTelefono = long.Parse(txtTelefono.Text);
                if(cboIsDeleted.SelectedItem == "Si"){
                    client.BitIsDeleted = true;
                }else{
                    client.BitIsDeleted = false;
                }
                
                
                if (IdCliente == 0)
                {
                    client.BigDNI = (txtDNI.Text != string.Empty) ? long.Parse(txtDNI.Text) : 0;
                    client = proxy.AddCliente(client);
                    proxyCiu.DeleteCiudadesFromCliente(client);
                    //Agregamos las funcionaldiades
                    foreach (CheckBox item in panel1.Controls)
                    {
                        if (item.Checked == true)
                        {
                            CiudadEntity ciu = new CiudadEntity();
                            string[] parts = item.Text.Split(' ');
                            ciu.IntIdCiudad = Int32.Parse(parts[0]);
                            proxyCiu.AddCiudadToCliente(ciu, client);
                        }
                    }

                }
                else
                {
                    client.IntIdCliente = IdCliente;
                    proxy.UpdateCliente(client);
                    proxyCiu.DeleteCiudadesFromCliente(client);
                    //Agregamos las ciudades
                    foreach (CheckBox item in panel1.Controls)
                    {
                        if (item.Checked == true)
                        {
                            CiudadEntity ciu = new CiudadEntity();
                            string[] parts = item.Text.Split(' ');
                            ciu.IntIdCiudad = Int32.Parse(parts[0]);
                            proxyCiu.AddCiudadToCliente(ciu,client);
                        }
                    }
                }
                this.Close();
            }
        }

        /// <summary>
        /// Funcion que valida si un mail esta bien escrito
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        private Boolean email_bien_escrito(String email)
        {
            String expresion;
            expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            if (Regex.IsMatch(email, expresion))
            {
                if (Regex.Replace(email, expresion, String.Empty).Length == 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }

        public bool ValidateForm() {
            bool res = true;
            string errores = string.Empty;


            //Validamos el DNI solo si es un agregar cliente
            if(IdCliente == 0){
                if (txtDNI.Text != string.Empty)
                {
                    try
                    {
                        long algo = long.Parse(txtTelefono.Text);
                    

                        //Nos fijamos si existe el id
                        ClienteEntity _cliente = new ClienteEntity();
                        ClienteBAL dal = new ClienteBAL();

                        _cliente.BigDNI = (txtDNI.Text != string.Empty) ? long.Parse(txtDNI.Text.ToString()) : 0;
                        //if (clienteInfo.BigDNI != _cliente.BigDNI)
                        //{

                            _cliente = dal.GetClientesByDNI(_cliente);
                            if (_cliente != null && _cliente.IntIdCliente != 0)
                            {
                                errores += "El DNI ya esta registrado\n";
                                res = false;
                            }
                        }
                    catch (FormatException ex)
                    {
                        errores += "El DNI no tiene un formato valido\n";
                        res = false;
                    }
                    catch (OverflowException ex)
                    {
                        errores += "El DNI no tiene un formato valido\n";
                        res = false;
                    }
                    //}
                }
                else {
                    errores += "El DNI es obligatorio\n";
                    res = false;
                }
            }
            if(txtApellido.Text == string.Empty){
                errores += "El Apellido es obligatorio\n";
                res = false;
            }
            if (txtCodigoPostal.Text == string.Empty)
            {
                errores += "El Codigo Postal es obligatorio\n";
                res = false;
            }
            else {
                try {
                    int algo = Int32.Parse(txtCodigoPostal.Text);
                }catch(FormatException ex){
                    errores += "El Codigo Postal no tiene un formato valido\n";
                    res = false;
                }
                catch (OverflowException ex)
                {
                    errores += "El Codigo Postal es muy grande\n";
                    res = false;
                }
            
            }
            if (txtDireccion.Text == string.Empty)
            {
                errores += "La direccion es obligatorio\n";
                res = false;
            }
            if (txtMail.Text == string.Empty)
            {
                errores += "El email es obligatorio\n";
                res = false;
            }
            else { 
                //Validamos el mail
                if (!email_bien_escrito(txtMail.Text))
                {
                    errores += "El email no es valido\n";
                    res = false;
                }
            }
            if (txtTelefono.Text == string.Empty)
            {
                errores += "El telefono es obligatorio\n";
                res = false;
            }
            else {
                try
                {
                    long algo = long.Parse(txtTelefono.Text);
                }
                catch (FormatException ex)
                {
                    errores += "El Telefono no tiene un formato valido\n";
                    res = false;
                }
                catch (OverflowException ex)
                {
                    errores += "El Telefono no tiene un formato valido\n";
                    res = false;
                }
            }


            if (txtNomre.Text == string.Empty)
            {
                errores += "El nombre es obligatorio\n";
                res = false;
            }

            if (cboIsDeleted.SelectedItem == null || cboIsDeleted.SelectedItem.ToString() == string.Empty)
            {
                errores += "Debe elegir un valor para el campo deshabilitado\n";
                res = false;
            }
            if (errores != string.Empty)
            {
                MessageBox.Show(errores, "Hubo Errores");
            }
            return res;
        }

    }
}
